package com.freemarker.doc;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;

/**
 * 使用freemark生成word文件
 *
 */
public class CreateWord {
	
	/**
	 * freemark模板配置
	 */
	private Configuration configuration;
	
	public static void main(String[] args){
		String templatePath = "template/";
		String templateName = "temp.ftl";
		String filePath = "bin/";
		String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+"ee.doc";
		new CreateWord().create(templatePath,templateName,filePath,fileName);
	}
	
	public void configure(String templatePath){
		configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");
		configuration.setClassForTemplateLoading(this.getClass(), templatePath);
	}
	
	public void create(String templatePath,String templateName,String filePath,String fileName){
		this.configure(templatePath);
		Template template = null;
		try {
			//读取freemarker的导出模板  
			template = configuration.getTemplate(templateName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//创建一个file对象
		File outFile = new File(filePath+fileName);
		//写入字符流的抽象类
		Writer out = null;
		try {
			//创建一个使用默认大小输出缓冲区的缓冲字符输出流
			//OutputStreamWriter 字节-字符转换流
			//FileOutputStream 文件输出流 
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
		Map<String, Object> map = new HashMap<String, Object>();
		//填充数据模型,数据模型就是一个Map对象
		map.put("name", "于心");
		map.put("photo", this.getImageStr());
		map.put("sex", "男");
		map.put("birth", "1992-10");
		map.put("tel", "1234567890");
		map.put("email", "123@163.com");
		map.put("address", "山东 济南");
		
		try {
			//执行模板,使用提供的数据模型
			template.process(map, out);
			out.close();
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 由于word中图片为base64编码，
	 * 故将图片转化为base64编码后的字符串
	 * @return String
	 */
	public  String getImageStr() {
        String imgFile = new File(this.getClass().getResource("/").getPath()) +"/com/freemarker/doc/template/1.jpg";
        InputStream in = null;
        byte[] data = null;
        try {
        	//创建照片的字节输入流
            in = new FileInputStream(imgFile);
            //创建一个长度为照片总大小的内存空间
            data = new byte[in.available()];
            //从输入流中读取文件大小的字节，并将其存储在缓冲区数组 data中
            in.read(data);
            //关闭输入流
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        //进行base64加密
        return encoder.encode(data);
    }
}
